package heap;

import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

/**
 * https://blog.csdn.net/f641385712/article/details/81115164
 */
public class T05_Random {
    static int MIN = 50;
    static int MAX = 100;
    static int FACTOR = 10;

    public static void main(String[] args) {
        // 伪随机数，并不是真正的随机数
        // 伪随机（preundorandom）：通过算法产生的随机数都是伪随机！！
        // 真随机：比如，通过机器的硬件噪声产生随机数、通过大气噪声产生随机数。（只有通过真实的随机事件产生的随机数才是真随机）
        demo1();
        demo2();
        demo3();
        demo4();
    }

    public static void demo1() {
        Random rand = new Random();
        int num = rand.nextInt(MAX - MIN + 1) + MIN;
        System.out.println(num);

        Random r = new Random(1000); // 两个 random 对象，只要 seed 种子一样，输出的随机数都是一样的
        for (int i = 1; i < 4; i++) {
            System.out.println("第" + i + "次：" + r.nextInt());
        }
    }

    public static void demo2() {
        for (int i = 0; i < 3; i++) {
            int num = (int) (Math.random() * FACTOR);
            System.out.println("num is:" + num);
        }
    }

    public static void demo3() {
        long l = System.currentTimeMillis();
        System.out.println(l % 1000);
    }

    /**
     * ThreadLocalRandom 类是 JDK7 在 JUC 包下新增的随机数生成器，它解决了 Random 类在多线程下多个线程竞争内部唯一的原子性种子变量而导致
     * 大量线程自旋重试的不足。
     * ThreadLocalRandom 使用的 ThreadLocal，让每个线程内持有一个本地的种子变量，该种子变量只有在使用随机数时候才会被初始化，多线程下计算
     * 新种子时候是根据自己线程内维护的种子变量进行更新，从而避免了竞争。
     */
    public static void demo4() {
        ThreadLocalRandom threadRandom = ThreadLocalRandom.current();
        System.out.println(threadRandom.nextInt(10));
        System.out.println("-----------产生两个数之间的随机数----------------");
        System.out.println(threadRandom.nextInt(10, 100));
        System.out.println("---------------------------");
        // 随机生成 UUID
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid);
    }
}
